package config

import (
	"log"

	"github.com/spf13/viper"
)

// Config 定义配置结构体
type Config struct {
	App struct {
		Name string
		Port string
	}
	Database struct {
		Host         string
		Port         string
		Name         string
		Username     string
		Password     string
		DSN          string // 数据库连接字符串
		MaxIdleConns int    // 连接池最大空闲连接数
		MaxOpenConns int    // 连接池最大打开连接数
		Path         string // 数据库文件路径
	}
}

var config *Config

func GetConfig() *Config {
	return config
}

func InitConfig(mode string) {
	switch mode {
	case "dev":
		initConfigByPath("./main/resources/dev")
	case "prod":
		initConfigByPath("./resources")
	default:
		initConfigByPath("./main/resources/dev")
	}
}

func initConfigByPath(path string) {
	// 设置配置文件名称、类型、路径
	viper.SetConfigName("config")
	viper.SetConfigType("yml")
	viper.AddConfigPath(path)
	// 读取配置文件内容
	if err := viper.ReadInConfig(); err != nil {
		log.Fatalf("Error reading config file, %v", err) // v%：相应值的默认格式
	}
	resolveAndInitDB()
}

func resolveAndInitDB() {
	// 解析配置文件内容到结构体
	config = &Config{}
	if err := viper.Unmarshal(config); err != nil {
		log.Fatalf("Error unmarshaling config, %v", err)
	}

	// 初始化数据库连接
	initDB()
}

// 配合 go embed 使用
// func initConfigByBytes(data []byte) {
// 	// 设置配置文件类型
// 	viper.SetConfigType("yml")

// 	// 读取配置文件内容
// 	if err := viper.ReadConfig(bytes.NewReader(data)); err != nil {
// 		log.Fatalf("Error reading config file, %v", err) // v%：相应值的默认格式
// 	}

// 	resolveAndInitDB()
// }
